package admin

import (
	"encoding/json"
	"fmt"
	"github.com/gin-contrib/sessions"
	"github.com/gin-gonic/gin"
	"net/http"
	"syudy/Models"
)

type LoginController struct {
	BaseController
}

// 登录页面控制器
func (con LoginController) Index(c *gin.Context) {
	c.HTML(http.StatusOK, "admin/login/login.html", gin.H{})
}

// DoLogin 处理登录表单提交，验证验证码
func (con LoginController) DoLogin(c *gin.Context) {
	// 从POST表单中获取验证码ID和用户输入的验证码值，用来进行验证码校验
	captchaId := c.PostForm("captchaId")     // 验证码的唯一标识ID
	verifyValue := c.PostForm("verifyValue") // 用户输入的验证码内容
	// 从POST表单中获取用户名和用户输入的密码，用来进行判断用户是否存在
	username := c.PostForm("username") //获取前端表单传过来的用户名
	password := c.PostForm("password") //获取前端表单传过来的密码

	//验证验证码是否正确
	// 调用Models包中的验证码验证函数 ,flag: 验证结果，true表示验证通过，false表示验证失败
	if flag := Models.VerifyCaptcha(captchaId, verifyValue); flag {
		//查询数据库，判断用户密码是否正确
		userinfoList := []Models.Manager{}
		//因为数据库中存储的密码是md5加密的，所以需要把前端传过来的密码md5加密再和数据库中的密码对比
		password = Models.Md5(password)
		//判断用户名和加密后的密码是否和数据库中相同
		Models.DB.Where("username=? and password=?", username, password).Find(&userinfoList)
		//判断是否登录成功
		if len(userinfoList) > 0 {
			//调用session存储引擎，保存session
			session := sessions.Default(c)
			//因为session.Set只能设置string类型的数据，所以要把数据库中查询到的userinfoList转化为string
			userinfoListslice, _ := json.Marshal(userinfoList)
			session.Set("userinfo", string(userinfoListslice))
			session.Save()
			con.Success(c, "登录", "/admin")
		} else {
			con.Error(c, "用户名或密码错误", "/admin/login")
		}

	} else {
		con.Error(c, "验证失败", "/admin/login")
	}
}

func (con LoginController) Captcha(c *gin.Context) {
	/*	调用Models包MakeCaptcha生成验证码
		id: 验证码的唯一标识ID
		b64s: base64编码的验证码图片
		err: 错误信息  */
	id, b64s, err := Models.MakeCaptcha()
	if err != nil {
		fmt.Println(err)
	}
	/* 	以JSON格式返回验证码信息
	captchaId: 验证码ID
	captchaImg: base64编码的验证码图片  */
	c.JSON(http.StatusOK, gin.H{
		"captchaId":  id,
		"captchaImg": b64s,
	})
}

func (con LoginController) LoginOut(c *gin.Context) {
	session := sessions.Default(c)
	session.Delete("userinfo")
	session.Save()
	con.Success(c, "退出", "/admin/login")
}
